#pragma once

// Devices
#include <engine.input/Device.hpp>
#include <engine.video/Device.hpp>
/*#include <engine.audio/AudioDevice.hpp>*/

// Systems
/*#include <engine.database/System.hpp>
#include <engine.resource/System.hpp>*/
#include <engine.ui/System.hpp>
#include <engine.script/System.hpp>
#include <engine.entity/System.hpp>

#include "exports.hpp"




namespace Engine
{
	class ENGINE_API IEngine
	{
	public:

		typedef boost::shared_ptr<IEngine>   ptr;



		virtual Input::Device::ptr inputDevice() const = 0;
		virtual Video::Device::ptr videoDevice() const = 0;
		/*virtual AudioDevice::ptr audioDevice() const = 0;

		virtual DatabaseSystem::ptr databaseSystem() const = 0;
		virtual ResourceSystem::ptr resourceSystem() const = 0;*/
		virtual Ui::System::ptr uiSystem() const = 0;
		virtual Script::System::ptr scriptSystem() const = 0;
		virtual Entity::System::ptr entitySystem() const = 0;

		/**
		 * Updates the Engine.
		 */
		virtual void update() = 0;

		/**
		 * Update the size of the window.
		 * The input class needs this to calculate
		 * the relative mouse position.
		 */
		virtual void resize(int width, int height) = 0;

		/**
		 * Change the window handle.
		 */
		virtual void changeWindow(HWND window) = 0;



		/**
		 * Create an Engine from the given info.
		 */
		static ptr create(const EngineInfo& info);
	};
	///////////////////////////////////////////////////////////////////////////////////////////////
}
///////////////////////////////////////////////////////////////////////////////////////////////////
